<?php
use qhweb\phpsm\sm\SM2;
use qhweb\phpsm\sm\SM3;
use qhweb\phpsm\sm\SM4;


spl_autoload_register(function ($cls) {
    /**覆盖ecc里的oid与椭圆的对照数组，添加sm2 */
    $map = array(
        'Mdanter\Ecc\Serializer\Util\CurveOidMapper' => __DIR__ .'/ecc/Serializer/Util/CurveOidMapper.php',
        'Mdanter\Ecc\Curves\CurveFactory'=>__DIR__ .'/ecc/Curves/CurveFactory.php',
    );
    
    if (isset($map[$cls])) {
        include_once $map[$cls];
        return true;
    }
}, true, true);

if (!function_exists('sm3')) {
    /**
     * SM3加密
     * @param string $str 加密数据
     * @return string
     */
    function sm3($str,$key='')
    {
        return !empty($key) ? SM3::hmac($str,$key) : SM3::hash($str);
    }
}

if (!function_exists('sm4Encrypt')) {
    /**
     * SM4加密
     *
     * @param string $str  加密数据
     * @param string $type  加密类型
     * @param string $iv  向量
     * @param string $key 密钥
     * @param string $formatOut  输出格式
     * @return void
     */
    function sm4Encrypt(string $str, $type = 'sm4', $iv = '', $key='1234567890abcdef',$formatOut = 'hex')
    {
        $sm4 = new SM4($key);
        return $sm4->encrypt($str,$type,$iv,$formatOut);
    }
}

if (!function_exists('sm4Decrypt')) {
    /**
     * SM4解密
     *
     * @param string $str 解密数据
     * @param string $type 解密模式
     * @param string $iv  向量
     * @param string $key 密钥
     * @param string $formatInput  输入模式
     * @return void
     */
    function sm4Decrypt(string $str, $type = 'sm4', $iv = '', $key='1234567890abcdef',$formatInput = 'hex')
    {
        $sm4 = new SM4($key);
        return $sm4->decrypt($str,$type,$iv,$formatInput);
    }
}

if (!function_exists('createSm2Key')) {

    /**
     * 生成随机SM2密钥
     *
     * @return void
     */
    function createSm2Key()
    {
        $sm2 = new SM2();
        return $sm2->generatekey();
    }
}

if (!function_exists('createSm2KeyPem')) {

    /**
     * 生成随机SM2密钥 PEM
     *
     * @return void
     */
    function createSm2KeyPem()
    {
        $sm2 = new SM2();
        return $sm2->generatePemkey();
    }
}

if (!function_exists('sm2Encrypt')) {

    /**
     * SM2公钥加密
     *
     * @param [type] $str
     * @param [type] $publicKey
     * @return void
     */
    function sm2Encrypt($str,$publicKey)
    {
        $sm2 = new SM2();
        return $sm2->doEncrypt($str, $publicKey);
    }
}

if (!function_exists('sm2Decrypt')) {

    /**
     * SM2私钥解密
     *
     * @param [type] $str
     * @param [type] $privateKey
     * @return void
     */
    function sm2Decrypt($str,$privateKey)
    {
        $sm2 = new SM2();
        return $sm2->doDecrypt($str, $privateKey);
    }
}
if (!function_exists('sm2Sgin')) {
    /**
     * SM2私钥签名
     *
     * @param string $str
     * @param string $privateKey
     * @param string $userId
     * @return void
     */
    function sm2Sgin($str,$privateKey, $userId = null)
    {
        $sm2 = new SM2();
        return $sm2->doSign($str, $privateKey, $userId = null);
    }
}

if (!function_exists('sm2VerifySign')) {

    /**
     * SM2公钥验签
     *
     * @param string $str 数据
     * @param string $sgin  签名
     * @param string $publicKey  公钥
     * @param string|null $userId 用户ID
     * @return void
     */
    function sm2VerifySign($str, $sgin, $publicKey, $userId = null)
    {
        $sm2 = new SM2();
        return $sm2->verifySign($str, $sgin, $publicKey, $userId = null);
    }
}

if (!function_exists('sm2SignOut')) {

    /**
     * SM2公钥验签
     *
     * @param string $str 数据
     * @param string $privateKeyFile  私钥文件地址
     * @param string $userId 用户ID
     * @return void
     */
    function sm2SignOut($str, $privateKeyFile, $userId = null)
    {
        $sm2 = new SM2();
        return $sm2->doSignOutKey($str, $privateKeyFile, $userId = null);
    }
}

if (!function_exists('sm2VerifySignOut')) {

    /**
     * SM2公钥验签，外部PEM文件模式
     *
     * @param string $str 数据
     * @param string $sgin  签名
     * @param string $publickeyFile  公钥文件地址
     * @param string|null $userId 用户ID
     * @return void
     */
    function sm2VerifySignOut($str, $sgin, $publickeyFile, $userId = null)
    {
        $sm2 = new SM2();
        return $sm2->verifySignOutKey($str, $sgin, $publickeyFile, $userId = null);
    }
}